

#include "utils.h"
#include "Preferences.h"
#include <Preferences.h>
#include<WiFi.h>

bool isPrint = true;

Preferences preferences;

void clearPreference(){
    preferences.begin("my-app", false);
    preferences.clear();
}

void removePreference(String key){
   preferences.begin("my-app", false);
   preferences.remove(key.c_str());
}


bool isNumeric(const String &str)
{
    char buf[str.length() + 1];             // 创建一个足够大的字符数组来存储字符串的副本
    str.toCharArray(buf, str.length() + 1); // 将String转换为char数组
   // char *endptr;                          // 用于strtol的错误检查
   // long value = strtol(buf, &endptr, 10); // 尝试将字符串转换为长整数
   for (size_t i = 0; i < str.length(); i++)
   {
      if(!isDigit(buf[i])&&(buf[i]!='.')){
        return false;
      }
   }
  return true;
}

bool putPreferenceString(String key, String value)
{
    preferences.begin("my-app", false);
    preferences.putString(key.c_str(), value);
    return true;
}
bool isPrefContainKey(String key){
    preferences.begin("my-app", false);
    return preferences.isKey(key.c_str());
}


String getPreferenceString(String key)
{
    preferences.begin("my-app", false);
    if (preferences.isKey(key.c_str()))
    {
        return preferences.getString(key.c_str());
    }

    return String();
}

bool putPreferenceBool(String key, bool value)
{
    preferences.begin("my-app", false);
 
    preferences.putBool(key.c_str(), value);
    return true;
}


int getStrength(int points)
{
  long rssi = 0;
  long averageRSSI = 0;

  for (int i = 0; i < points; i++)
  {
    rssi += WiFi.RSSI();
    //delay(20);
  }

  averageRSSI = rssi / points;
  return averageRSSI;
}


bool getPreferenceBool(String key)
{
    preferences.begin("my-app", false);
    if (preferences.isKey(key.c_str()))
    {
        return preferences.getBool(key.c_str());
    }
    return false;
}
float getRssi()
{
  int rssi = getStrength(5);
  float p = 1 - (abs(rssi) - 30) * 1.0 / 60 * 1.0;
  float roundedNumber = round(p * 100.0) / 100.0;
   if(roundedNumber>1){
    roundedNumber=1.0;
   }
   if(roundedNumber<0){
      roundedNumber=0.0;
   }
  return roundedNumber;
}

String getEspId()
{

    // int chipId;
    // for (int i = 0; i < 17; i = i + 8)
    // {
    //     chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
    // }
    // return String(chipId).c_str();

    return String(ESP.getEfuseMac());
}

void setupRTCTime()
{
    // 检查RTC是否正在运行
    //   if (!rtc.begin()) {
    //     Serial.println("Couldn't find RTC");
    //     while (1); // 如果找不到RTC，则停止程序
    //   }

    //   // 如果RTC没有运行，则设置时间
    //   if (!rtc.isRunning()) {
    //     Serial.println("RTC is NOT running!");
    //     // 设置RTC时间为当前编译时间（这通常是在首次使用或RTC被重置后执行）
    //     rtc.adjust(DateTime(__DATE__, __TIME__));
    //   }
}

bool isStringEmpty(String str)
{

    if (str == NULL)
    {
        return true;
    }
    str.trim();
    if (str.isEmpty() || str.equals("null"))
    {

        return true;
    }

    return false;
}

 void printStr(String label,String value){
    if(!isPrint){
        return;
    }
    Serial.print(label);
     Serial.print(":");
      Serial.println(value);
 }

  void printStr(String label,bool value){
      if(!isPrint){
        return;
    }
    Serial.print(label);
     Serial.print(":");
      Serial.println(value);
 }

  void printStr(String label,float value){
      if(!isPrint){
        return;
    }
    Serial.print(label);
     Serial.print(":");
      Serial.println(value);
 }

  void printStr(String label,int value){
      if(!isPrint){
        return;
    }
    Serial.print(label);
     Serial.print(":");
      Serial.println(value);
 }

   void printStr(String label){
      if(!isPrint){
        return;
    }
    Serial.println(label);
    Serial.flush();
    
 }

   void printStr(String label,  long value){
      if(!isPrint){
        return;
    }
    Serial.print(label);
     Serial.print(":");
      Serial.println(value);
 }

    void printStr(String label, unsigned long value){
          if(!isPrint){
        return;
    }
    Serial.print(label);
     Serial.print(":");
      Serial.println(value);
 }


 String convertToUpperCaseMacAddress(const char* macAddress) {
  // 创建一个足够大的字符数组来临时存储转换后的MAC地址（不包括末尾的'\0'）
  char tempMacAddress[17]; // MAC地址是6组2个字符加上5个冒号，总共17个字符
  int j = 0; // 索引变量
 
  // 遍历输入字符串
  for (int i = 0; macAddress[i] != '\0'; i++) {
    char c = macAddress[i];
    if (c >= 'a' && c <= 'z') {
      c = c - ('a' - 'A'); // 转换为大写
    }
    tempMacAddress[j++] = c;
    // 注意：这里我们不需要处理冒号，因为它不是字母，所以直接复制即可。
  }
 
  // 注意：这里我们实际上没有为'\0'字符留出空间，因为我们打算将结果转换为String。
  // 如果要使用char数组作为返回类型，我们需要分配一个大小为18的数组（包括'\0'）。
 
  // 将转换后的MAC地址（不包括末尾的'\0'）转换为String并返回
  // String类会自动处理内存分配和空终止符，所以我们不需要担心'\0'。
  return String(tempMacAddress, j); // j是转换后字符串的实际长度（不包括'\0'）
}